#ifndef _HALL_CONFIG_H_
#define _HALL_CONFIG_H_

#include "Define.h"
#include <string>

enum ERoomMode
{
    E_RoomMode_Match    = 1, // 防作弊匹配模式
    E_RoomMode_Manual   = 2, // 全桌子列表,手动进入模式
    E_RoomMode_Friend   = 3, // 好友开房间模式
};

enum EMatchMode
{
    E_MatchMode_FixedUser   = 0,    // 按固定人数进行匹配，例如斗地主等
    E_MatchMode_FillRoom,           // 按填充房间方式进行匹配，例如牛牛，咋金花，德州等

    E_MatchMode_Count,
};

struct HallCfg
{
    s32 gameId;
    s32 gameMode;   // 游戏模式,各游戏解析使用,如斗地主分经典和癞子
    s32 roomMode;   // 房间模式,系统匹配或是手动创建房间模式
    s32 level;  // 等级,例如初级、中级、高级
    s32 ante;   // 基础底注
    s32 taxMultiple; // 扣税倍数(底注的倍数)

    s32 roomCount; // 房间个数
    s32 minPlayerCount; // 最少开局人数
    s32 maxPlayerCount; // 房间内的座位数,最多对局玩家个数
    s32 maxBeholderCount; // 房间内旁观的最大人数

    s32 teamQueueCount; // 匹配队列数量,例如斗地主3人对局可以设置为3
    s32 teamMatchMode; // 匹配方式 EMatchMode

    s32 roomMoneyUpLimit;       // 进房间的最少钱限制
    s32 roomMoneyBottomLimit;   // 进房间的钱的上限

    u64 dbSid; // 连接的dbproxy服务器的serverid
    u64 centerSid; // 连接的center服务器的serverid
    u64 roomCenterSid;
    u64 recordSid; // 连接的录像服务器
    u64 balanceSid; // 连接均衡服务器，所有防作弊房间需要连接

    s32 friendRoomExpireSec; // 房间有效时长
    s32 friendRoomIdleExpireSec; // 房间未开始的时长

    s32 pauseDismissRoom; // 解散好友局时是否暂停时钟

    s32 interactItemPrice; // 互动道具价格
    s32 useInteractItemInterval;

    s64 param1;
    s64 param2;
    s64 param3;
    s64 param4;
    s64 param5;

    // UDP 消息服的配置信息
    std::string udpIp;
    s32 udpPort;
    std::string udpPasswd;
};

class CHallConfig
{
    SINGLETON_CLASS_DEFINE(CHallConfig);

public:
    bool Load(u64 sid, const char *file);
    const HallCfg& GetCfg() { return m_cfg; };
    int MaxNum()
    {
        return (m_cfg.roomCount * (m_cfg.maxPlayerCount + m_cfg.maxBeholderCount));
    }

private:
    HallCfg m_cfg;
};

#endif

